home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / utilities / cli / asplit203.lha / ASplit / Asplit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-14  |  5.6 KB  |  279 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <sys/dir.h>
  5. #include <sys/stat.h>
  6. #define DEFAULT_SIZE 1024
  7. #define ShowError(a) ShowErrorFunc(__LINE__,a)
  8.  
  9. #ifndef O_BINARY
  10. #define O_BINARY 0
  11. #endif
  12.  
  13. void ShowErrorFunc (int line,char *s);
  14.  
  15. static char* _ver="$VER: Asplit 2.03";
  16.  
  17. extern int errno;
  18.  
  19. void ShowErrorFunc(int line,char *s)
  20. {
  21.   fprintf(stderr,"%s: Error on line %d,",s,line);
  22.   perror("");
  23.   exit(errno);
  24. }
  25.  
  26.  
  27. void usage(char *s)
  28. {
  29.   fprintf(stderr,"%s by MENDEZ Marc. (%s %s) All right reserved. Copyright 1994\n",s,__DATE__,__TIME__);
  30.   fprintf(stderr,"Usage: %s [-b buffer] [-n number] -s size filein [fileout|directory]\n",s);
  31.   exit(1);
  32. }
  33.  
  34. char * basename(char *Path)
  35. {
  36.   char *p,*t ;
  37.   
  38.   if ((p=strrchr(Path,'/'))==NULL)
  39.     p=strrchr(Path,':');
  40.   
  41.   p = (p==NULL ? Path : p+1);
  42.   if ((t=(char *)malloc(strlen(p)+1))==NULL)
  43.     ShowError("malloc");
  44.   
  45.   strcpy(t,p);
  46.   return t;
  47. }
  48.  
  49. int OpenOutputFile(char *root, int num,char *StrTemplate)
  50. {
  51.   int Ptr;
  52.   char *EffectiveFileNameOut;  
  53.  
  54. #ifndef AMIGA
  55.   int mask;
  56.   
  57.   umask(mask=umask(0));
  58.   mask=(~mask)&(S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
  59.   
  60. #endif
  61.   
  62.   if ((EffectiveFileNameOut=(char*)malloc(sizeof(char)*(MAXNAMLEN+1)))==NULL)
  63.     ShowError("malloc");
  64.  
  65.   sprintf(EffectiveFileNameOut,StrTemplate,root,num);
  66.  
  67. #ifndef AMIGA
  68.   if ( (Ptr =
  69.     open(EffectiveFileNameOut,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,mask))<0)  
  70. #else
  71.   if ( (Ptr =
  72.     open(EffectiveFileNameOut,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY))<0)  
  73. #endif
  74.     ShowError("open");
  75.  
  76.   free(EffectiveFileNameOut);
  77.   return Ptr;
  78.   
  79. }
  80.  
  81.  
  82. int main(int argc, char *argv[])
  83. {
  84.   int In, Out;
  85.   long Size=0;
  86.   char *Buffer;
  87.   long BufferSize=DEFAULT_SIZE;
  88.   char *FileNameIn=NULL, *FileNameOut=NULL;
  89.   struct stat StatBuffer;
  90.   
  91.   int i=1;
  92.   int NumberOfCharRead;
  93.   int NumberOfCharToRead;
  94.   long FileNumber=0;
  95.   long FileNumberBase=0;
  96.   
  97.   long NumberMaxOfFile;
  98.   char *StringTemplate;
  99.   
  100.  
  101.   if (argc==1)
  102.     usage(argv[0]);
  103.   
  104.  
  105.   while (i<=(argc-1))
  106.     {
  107.       switch(argv[i][0])
  108.     {
  109.     case '-':
  110.       {
  111.         switch(argv[i][1])
  112.           {
  113.           case 'b':
  114.         {
  115.           long t;
  116.           if (i+1>(argc-1))
  117.             usage(argv[0]);
  118.           if ((t=atol(argv[i+1]))<=0)
  119.             usage(argv[0]);
  120.           BufferSize=t;
  121.           i++;
  122.           break;
  123.         }        /* case 'b' */
  124.           case 's':
  125.         {
  126.           long t;
  127.           if (i+1>(argc-1))
  128.             usage(argv[0]);
  129.           if ((t=atol(argv[i+1]))<=0)
  130.             usage(argv[0]);
  131.           Size=t;
  132.           i++;        
  133.           break;
  134.         }        /* case 's' */
  135.           case 'n':
  136.         {
  137.           if (i+1>(argc-1))
  138.             usage(argv[0]);
  139.           if ((FileNumberBase = atol (argv[i+1]))<0)
  140.               usage(argv[0]);
  141.           i++;
  142.           break;
  143.         } /* case 'n' */
  144.           default:
  145.           usage(argv[0]);
  146.                 /* default */
  147.           }            /* switch(argv[i][1]) */
  148.         break;
  149.       }            /* case '-' */
  150.     default:
  151.       {
  152.         char *t;
  153.         if ((t=(char*)strdup(argv[i]))==NULL)
  154.           ShowError(argv[0]);
  155.  
  156.         if (FileNameIn==NULL)
  157.           {
  158.         if ((FileNameIn=(char*)strdup(t))==NULL)
  159.           ShowError(argv[0]);
  160.           }
  161.         else
  162.           {
  163.         if (FileNameOut==NULL)
  164.           {
  165.             if ((FileNameOut=(char*)strdup(t))==NULL)
  166.               ShowError(argv[0]);
  167.           }
  168.         else
  169.           usage(argv[0]);
  170.           }
  171.         free(t);
  172.         break;
  173.       }            /* default: */
  174.     }            /* switch(argv[i][0]) */
  175.       i++;
  176.     }                /* while (i<=argc) */
  177.  
  178.   if (FileNameOut==NULL && FileNameIn==NULL)
  179.     usage(argv[0]);
  180.   
  181.  
  182.   if (FileNameOut==NULL)
  183.     {
  184.       char *t;
  185.       
  186.       if ((t=getcwd(NULL,MAXNAMLEN))==NULL)
  187.     ShowError(argv[0]);
  188.  
  189.       if ( (FileNameOut = (char *)malloc( strlen(t) + 1 +
  190.                    strlen(basename(FileNameIn)) + 1))
  191.       == NULL) 
  192.     ShowError(argv[0]);
  193.       
  194.       if ( *(t+strlen(t)-1)!=':' )
  195.     sprintf(FileNameOut,"%s/%s",t,basename(FileNameIn));
  196.       else
  197.     sprintf(FileNameOut,"%s%s",t,basename(FileNameIn));
  198.       
  199. /*      if ((FileNameOut=(char*)strdup(basename(FileNameIn)))==NULL)
  200.     ShowError(argv[0]);
  201. */
  202.     }
  203.   else
  204.     {
  205.       char t;
  206.       char *NewFileNameOut;
  207.       
  208.       t = *(FileNameOut+strlen(FileNameOut)-1);    /* The last character */
  209.                         /* of FileNameOut. */
  210.       
  211.       if (t==':' || t=='/')    /* The last argument is the name of */
  212.                 /* the destination directory. */
  213.     {
  214.       int NewSize;
  215.       
  216.       NewSize = strlen(FileNameOut) + strlen(basename(FileNameIn)) +
  217.         1 ; 
  218.       
  219.       if ((NewFileNameOut= (char *)malloc(NewSize)) == NULL) 
  220.         ShowError(argv[0]);
  221.       sprintf(NewFileNameOut,"%s%s",FileNameOut,basename(FileNameIn));
  222.       free(FileNameOut);
  223.       FileNameOut = NewFileNameOut;
  224.     }                          
  225.     }
  226.   
  227.   if (FileNameIn==NULL | Size==0)
  228.     usage(argv[0]);
  229.  
  230.   if ((In=open(FileNameIn,O_RDONLY|O_BINARY))<0)
  231.     ShowError(argv[0]);
  232.  
  233.   if (stat(FileNameIn,&StatBuffer)==0)
  234.     {
  235.       long OriginalSize;
  236.       char t[256];
  237.       
  238.       OriginalSize= StatBuffer.st_size;
  239.       NumberMaxOfFile = FileNumberBase + (OriginalSize/Size) + (OriginalSize%Size == 0
  240.                            ? 0 : 1);
  241.       sprintf(t,"%d",NumberMaxOfFile);
  242.       if ((StringTemplate=(char *)malloc(strlen("%0d")+strlen(t)+1))==NULL)
  243.     ShowError(argv[0]);
  244.       sprintf(StringTemplate,"%%s%%0%dd",strlen(t));      
  245.     }
  246.   else
  247.     ShowError(argv[0]);
  248.   
  249.   if ((Buffer=(char*)malloc(sizeof(char)*BufferSize))==NULL)
  250.     ShowError(argv[0]);
  251.   
  252.   for(FileNumber=FileNumberBase;FileNumber<NumberMaxOfFile ;FileNumber++)
  253.     {
  254.       Out=OpenOutputFile(FileNameOut,FileNumber,StringTemplate);
  255.       
  256.       for(i=1;(i<=(int)(Size/BufferSize)+((Size % BufferSize) > 1 ? 1
  257.                       : 0)) ;i++) 
  258.     {
  259.       NumberOfCharToRead=(int)(Size/(BufferSize*i)) >=1 ?
  260.         BufferSize : Size % BufferSize;
  261.       
  262.       if ((NumberOfCharRead=read(In,Buffer,NumberOfCharToRead))!=NumberOfCharToRead)
  263.         {
  264.           if (NumberOfCharRead<0)
  265.         ShowError(argv[0]);
  266.         }
  267.  
  268.       if (write(Out,Buffer,NumberOfCharRead)!=NumberOfCharRead)
  269.         ShowError(argv[0]);
  270.     }
  271.       close(Out);
  272.     }
  273.   
  274.   close(In);
  275.   return 0;
  276.  
  277.   
  278. }
  279.